package driver;

import java.io.*;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.Calendar;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.StringTokenizer;

import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap;

import classes.Camps;
// import classes.Dia;
import driver.Utilitats.TipusFitxers;

public class ConfiguracioA implements Configuracio {

	private int any;
	private int mes;
	private String idiomaIn;
	private String idiomaOut;

	private Camps mCampsIN, mCampsOUT;

	public ConfiguracioA() {
		super();
		Log.crearLog();
		valorsConfig();
		validarValorsConfig();
		omplirConfiguracio();

	}

	private void omplirConfiguracio() {

		mCampsIN = new Camps();
		mCampsOUT = new Camps();
		omplirCamps(mCampsIN, idiomaIn); // Las variables globals idiomaIn i
											// idiomaOut venen
		omplirCamps(mCampsOUT, idiomaOut); // plenes desde el metode
											// valorsConfig

	}

	private void validarValorsConfig() {
		String mensajeLog = null;
		// Validar que el a�o no sea inferior al a�o actual.
		Calendar fecha = Calendar.getInstance();
		int anoActual = fecha.get(Calendar.YEAR);
		if (anoActual > any) {
			mensajeLog = "Error : a�o a tratar (" + any
					+ ") es anterior al actual (" + anoActual + ")";
			Log.llenarLog(mensajeLog);
		}
		// Validar que el a�o no sea mayor que 2020.
		if (any > 2020) {
			mensajeLog = "Error : el a�o indicado (" + any
					+ ") es posterior al a�o 2020 ";
			Log.llenarLog(mensajeLog);
		}
		// Validar que mes este comprendido entre 1 y 12.
		if (mes > 12 || mes < 1) {
			mensajeLog = "Error : el mes indicado (" + mes
					+ ") no esta comprendido entre 1 y 12 ";
			Log.llenarLog(mensajeLog);
		}
		// El idioma de entrada "idiomaIn" no existe.
		String filename = "INTERNACIONAL." + idiomaIn;
		File file = new File(Utilitats.PATH()+filename);
		if (file.exists() == false) {
			mensajeLog = "Error : el fichero INTERNACIONAL." + idiomaIn
					+ " no existe ";
			Log.llenarLog(mensajeLog);
		}
		// El idioma de entrada "idiomaOut" no existe.
		filename = "INTERNACIONAL." + idiomaOut;
		file = new File(Utilitats.PATH()+filename);
		if (file.exists() == false) {
			mensajeLog = "Error : el fichero INTERNACIONAL." + idiomaOut
					+ " no existe ";
			Log.llenarLog(mensajeLog);
		}
	}

	public static boolean isNumeric(String str) {
		return (str.matches("[+-]?\\d*(\\.\\d+)?") && str.equals("") == false);
	}

	private void omplirCamps(Camps auxCamps, String idiomaAux) {
		BufferedReader br = null;
		String[] arrayMesos = null;
		String[] arrayDias = null;
		String[] arrayDiasAbr = null;
		String[] arrayDiasAbrOri = null;
		String[] arrayAnyMesSetmanaDia = null;
		String titolInt = null;
		String tancatInt = null;
		String GeneratPerInt = null;
		String errorInt = null;

		// System.out.println(idiomaAux);
		try {
			br = Utilitats.obrirFixerInternacional(TipusFitxers.INTERNACIONAL,
					idiomaAux);
			// Bucle para tratar las lineas del fichero
			String linea;
			while ((linea = br.readLine()) != null) {
				// buscar mes, dia semana y dia semana abreviado.
				
				try{
					String terceraPosicionStr = (linea.substring(2, 3));
				
				
				//
				// s'ha de comprobar que si no es numeric dona error.
				//

				if (isNumeric(terceraPosicionStr) == true) {
					int terceraPosicion = Integer.parseInt(terceraPosicionStr);
					if (terceraPosicion == 4) {
						// recuperem el que hi ha desde el ";"
						int inicio = linea.indexOf(";");
						String mesos = linea.substring(inicio + 1);
						// En este momento tenemos un array en el que cada
						// elemento es un mes.
						arrayMesos = mesos.split(",");
					} else if (terceraPosicion == 2) {
						int inicio = linea.indexOf(";");
						String dias = linea.substring(inicio + 1);
						// En este momento tenemos un array en el que cada
						// elemento es un dia.
						arrayDias = dias.split(",");
					} else if (terceraPosicion == 3) {
						int inicio = linea.indexOf(";");
						String diasAbr = linea.substring(inicio + 1);
						// En este momento tenemos un array en el que cada
						// elemento es un dia Abreujat.
						arrayDiasAbrOri = diasAbr.split("");
						arrayDiasAbr = diasAbr.split("");
						// Guardamos la ultima posicion del array
						// El split crea el array con una posicion m�s, que la
						// deja en blanco
						String ultimaPosicioArray = arrayDiasAbrOri[arrayDiasAbrOri.length - 2];
						// pasamos array original arrayDiasAbrOri
						// (lunes-domingo)
						// al array definitivo arrayDiasAbr (domingo-sabado)
						for (int x = 0; x < arrayDiasAbrOri.length - 2; x++) {
							arrayDiasAbr[x + 1] = arrayDiasAbrOri[x];
						}
						arrayDiasAbr[0] = ultimaPosicioArray;
						// imprimir array resultante
						
						// for (int x=0;x<arrayDiasAbr.length;x++) {
						// System.out.println(arrayDiasAbr[x]); }
						 

					} else if (terceraPosicion == 5) {
						int inicio = linea.indexOf(";");
						String anyMesSetmanaDia = linea.substring(inicio + 1);
						// En este momento tenemos un array en el que cada
						// elemento es un tipus de periode.
						arrayAnyMesSetmanaDia = anyMesSetmanaDia.split(",");
					} else if (terceraPosicion == 1) {
						int inicio = linea.indexOf(";");
						titolInt = linea.substring(inicio + 1);
					} else if (terceraPosicion == 6) {
						int inicio = linea.indexOf(";");
						GeneratPerInt = linea.substring(inicio + 1);
					} else if (terceraPosicion == 7) {
						int inicio = linea.indexOf(";");
						tancatInt = linea.substring(inicio + 1);
					} else if (terceraPosicion == 8) {
						int inicio = linea.indexOf(";");
						errorInt = linea.substring(inicio + 1);
					}
				}
				}catch(Exception o){
					Log.llenarLog("Error durante la lectura del archivo de configuracion");
					//return;
				
				}
			}

			Map<Utilitats.DiesSetmana, String> mDiaSetmana = new LinkedHashMap<Utilitats.DiesSetmana, String>();

			BiMap<Utilitats.DiesSetmanaABR, String> mDiaSetmanaABR = HashBiMap
					.create();

			Map<Utilitats.Mesos, String> mMapStrMesos = new LinkedHashMap<Utilitats.Mesos, String>();

			for (Utilitats.DiesSetmana dia : Utilitats.DiesSetmana.values()) {
				mDiaSetmana.put(dia, arrayDias[dia.ordinal()].toString());
			}

			for (Utilitats.DiesSetmanaABR dia : Utilitats.DiesSetmanaABR
					.values()) {
				mDiaSetmanaABR.put(dia, arrayDiasAbr[dia.ordinal()].toString());
			}

			for (Utilitats.Mesos mes : Utilitats.Mesos.values()) {
				mMapStrMesos.put(mes, arrayMesos[mes.ordinal()].toString());
			}

			auxCamps.setStrTitol(titolInt);
			auxCamps.setStrDiesSetmana(mDiaSetmana);
			auxCamps.setStrDiesSetmanaABR(mDiaSetmanaABR);
			auxCamps.setMapStrMesos(mMapStrMesos);
			auxCamps.setStrAny(arrayAnyMesSetmanaDia[0]);
			auxCamps.setStrMes(arrayAnyMesSetmanaDia[1]);
			auxCamps.setStrSetmana(arrayAnyMesSetmanaDia[2]);
			auxCamps.setStrDia(arrayAnyMesSetmanaDia[3]);
			auxCamps.setStrError(errorInt);
			auxCamps.setStrGeneratPer(GeneratPerInt);
			auxCamps.setStrTancat(tancatInt);

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {

		ConfiguracioA mLeeFichero = new ConfiguracioA();
		// System.out.println(TipusFitxers.CONFIGURACIO);
		// File fitxer = new File(TipusFitxers.CONFIGURACIO.getNom());
		System.out.println(mLeeFichero.toString());
	}

	public void valorsConfig() {
		BufferedReader br = null;
		try {
			String linea;
			int i = 0;

			br = Utilitats.obrirFitxer(TipusFitxers.CONFIGURACIO);

			// Bucle para tratar las lineas del fichero
			while ((linea = br.readLine()) != null) {
				// Dividir cadena
				StringTokenizer st = new StringTokenizer(linea);
				while (st.hasMoreTokens()) {
					// parametrosConfig[i] = st.nextToken();
					if (i == 0) {
						any = Integer.parseInt(st.nextToken());
					} else if (i == 1) {
						mes = Integer.parseInt(st.nextToken());
					} else if (i == 2) {
						idiomaIn = st.nextToken();
					} else if (i == 3) {
						idiomaOut = st.nextToken();
					}
					i++;
				}

			}

		} catch (Exception e) {
			Log.llenarLog(e.getMessage());
			e.printStackTrace();
		}

	}

	@Override
	public int getAny() {
		return any;
	}

	@Override
	public int getMes() {
		return mes;
	}

	@Override
	public Camps getCampsIN() {
		return mCampsIN;
	}

	@Override
	public Camps getCampsOUT() {
		return mCampsOUT;
	}

	public String getIdiomaIn() {
		return idiomaIn;
	}

	public String getIdiomaOut() {
		return idiomaOut;
	}

	@Override
	public String toString() {
		String auxString = "";

		auxString += "Any :  " + any + "\n";
		auxString += "Mes :  " + mes + "\n";
		auxString += "IdiomaIn :  " + idiomaIn + "\n";
		auxString += "IdiomaOut :  " + idiomaOut + "\n";
		auxString += "  " + "\n";
		auxString += "mCampsIN :  " + mCampsIN + "\n";
		auxString += "mCampsOUT :  " + mCampsOUT + "\n";

		return auxString;
	}

}